package com.dust.yuheadline.gateway.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * <p>
 * 这个过滤器用来做什么？<br/>
 * 我们目前在网关聚合了多个微服务的swagger文档，它是基于网关路由的。
 * 比如网关将swagger文档的请求路由到user微服务，根据`application.yaml`中的配置，user微服务接收到的资源路径就是`/api/user/v3/api-docs`，
 * 但是在user微服务以及所有的微服务中，swagger文档的资源路径都是`/v3/api-docs`，所以当该请求被路由到下游微服务时，必须去掉前缀。
 * </p>
 *
 * @author 高翔宇
 * @since 2024/5/3 周五 上午11:31
 */
@Slf4j
@Component
@Order(1)
public class SwaggerFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getPath().toString();
        log.info("请求路径：{}", path);
        String[] swaggerPaths = {"/v3/api-docs"};
        for (String swaggerPath : swaggerPaths) {
            if (path.contains(swaggerPath)) {
                // 替换请求路径;
                return chain.filter(exchange.mutate().request(request.mutate().path(path.substring(path.indexOf(swaggerPath))).build()).build());
            }
        }
        return chain.filter(exchange);
    }
}
